/**
 * @author Silas Fontain, Søren Lorentzen, Daniel Nissen
 */

package service;

import java.util.GregorianCalendar;
import java.util.List;

import dao.Dao;

import ordination.DagligFast;
import ordination.DagligSkaev;
import ordination.Laegemiddel;
import ordination.PN;
import ordination.Patient;



public class Service {
	
	/**
	 * Opretter PN Ordination
	 * @return opretter og returnerer en PN ordination
	 */
	public static PN opretPNOrdination(GregorianCalendar startDen, GregorianCalendar slutDen, Patient patient, Laegemiddel laegemiddel, double antalEnheder){
		PN pn = new PN(startDen, slutDen, laegemiddel, (int)antalEnheder);
		patient.addOrdination(pn);
		return pn;
	}
	
	/**
	 * 
	 * Opretter DagligFast ordination
	 * @return opretter og returnerer en DagligFast ordination
	 * Bemaerk: negativ antal betyder ingen dosis paa dette tidspunkt
	 */
	public static DagligFast opretDagligFastOrdination(GregorianCalendar startDen, GregorianCalendar slutDen, Patient patient, Laegemiddel laegemiddel,double morgenAntal, double middagAntal, double aftenAntal, double natAntal){
		DagligFast df = new DagligFast(startDen, slutDen, laegemiddel);
		patient.addOrdination(df);
		if(morgenAntal > 0) 
			df.createDosis(morgenAntal, "Morgen");
		if(middagAntal > 0) 
			df.createDosis(middagAntal, "Middag");
		if(aftenAntal > 0) 
			df.createDosis(aftenAntal, "Aften");
		if(natAntal > 0) 
			df.createDosis(natAntal, "Nat");
		return df;
	}
	/**
	 * Opretter daglig skaev ordination
	 * Krav: antalEnheder og klokkeSl�t har samme laengde. klokkeSl�t indeholder tidspunkter p� dagen p� formen 15:30
	 * @return opretter og returnerer en DagligSk�v ordination
	 */

	public static DagligSkaev opretDagligSkaevOrdination(GregorianCalendar startDen, GregorianCalendar slutDen, Patient patient, Laegemiddel laegemiddel,String[] klokkeSlet, double[] antalEnheder) {
		DagligSkaev ds = new DagligSkaev(startDen, slutDen, laegemiddel); 
		for(int i = 0; i < klokkeSlet.length; i++) {
			ds.opretDosis(klokkeSlet[i], antalEnheder[i]);
		}
		patient.addOrdination(ds);
		return ds;
	}
	
	/**
	 * Registrerer at PN ordinationen er anvendt paa dagen dato
	 * @param ordination
	 * @param dato
	 * En dato for hvornaar ordinationen anvendes tilfoejes ordinationen.
	 * Hvis datoen ikke er indenfor ordinationens gyldighedsperiode kastes en RuntimeException 
	 */
	public static void ordinationPNAnvendt(PN ordination, GregorianCalendar dato){
		 if (dato.before(ordination.getSlutDen()) && dato.after(ordination.getStartDen())) 
			 ordination.dosisGivet(dato);
		 else 
			 throw new RuntimeException("Dato er uden for det tilladte tidsrum");
	}
	
	/**
	 * 
	 * @param patient
	 * @param laegemiddel
	 * @return den anbefalede dosis for den paagaeldende patient(der skal tages hensyn til patientens vaegt)
	 * Det er en forskellig enheds faktor der skal anvendes, den er afhaengig af patinetens vaegt 
	 */
	
	public static double anbefaletDosisPrDoegn(Patient patient, Laegemiddel laegemiddel){
		double result = 0;
		if (patient.getVaegt()<25)
			result = patient.getVaegt()*laegemiddel.getEnhePrKgPrDoegnLet();
		else if (patient.getVaegt()>120)
			result = patient.getVaegt()*laegemiddel.getEnhePrKgPrDoegnTung();
		else 
			result = patient.getVaegt()*laegemiddel.getEnhePrKgPrDoegnNormal();
		return result;
	}
	
	public static List<Patient> getAllPatienter(){
		return Dao.getAllPatienter();
	}
	
	public static List<Laegemiddel> getAllLaegemidler(){
		return Dao.getAllLaegemidler();
	}
	
	public static void createSomeObjects(){
		
		
		Dao.gemPatient(new Patient("Jane Jensen", "121256-0512", 63.4));
		Dao.gemPatient(new Patient("Finn Madsen", "070985-1153", 83.2));
		
		Dao.gemLaegemiddel(new Laegemiddel("Pinex", 0.1,0.15,0.16, "Styk"));
		Dao.gemLaegemiddel(new Laegemiddel("Paracetamol", 1,1.5,2, "Ml"));
		Dao.gemLaegemiddel(new Laegemiddel("Fucidin", 0.025, 0.025, 0.025, "Styk"));
		Dao.gemLaegemiddel(new Laegemiddel("ABC", 0.01,0.015,0.02, "Styk"));
	
		
//		opretPNOrdination(new GregorianCalendar(2007, 3,1), new GregorianCalendar(2007, 3,12), Dao.getAllPatienter().get(0), Dao.getAllL�gemidler().get(1), 123);
//		opretPNOrdination(new GregorianCalendar(2007, 4,12), new GregorianCalendar(2007, 3,12), Dao.getAllPatienter().get(0), Dao.getAllL�gemidler().get(0), 3);
//		
//		opretDagligFastOrdination(new GregorianCalendar(2007, 1,10), new GregorianCalendar(2007, 1,12), Dao.getAllPatienter().get(1), Dao.getAllL�gemidler().get(1),2,-1,1,-1);
//		String[] kl = {"12:00", "12:40","16:00","18:45"};
//		double[] an = {0.5, 1, 2.5, 3};
//		opretDagligSk�vOrdination(new GregorianCalendar(2007, 1,23), new GregorianCalendar(2007, 1,24), Dao.getAllPatienter().get(1), Dao.getAllL�gemidler().get(2), kl, an);
	
	}


}
